﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Joel.Vishnu.Presentacion.Vistas;
using Joel.Vishnu.Repositorios;
using Joel.Vishnu.Modelo.Enumeradores;
using Joel.Vishnu.Modelo.Entidades;

namespace Joel.Vishnu.Presentacion
{
    public class ProductoCategoriasPresentador
    {
        #region Constructores

        public ProductoCategoriasPresentador(IProductoCategorias vista)
        {
            this.vista = vista;
        }

        #endregion

        #region Atributos

        private IProductoCategorias vista;

        #endregion

        #region Propiedades

        public RepositorioProductoCategoria RepositorioProductoCategoria
        {
            get { return new RepositorioProductoCategoria(); }
        }

        public RepositorioProductoSubCategoria RepositorioProductoSubCategoria
        {
            get { return new RepositorioProductoSubCategoria(); }
        }

        #endregion

        #region Metodos

        public void Inicializar()
        {
            ActualizarCategorias();
        }

        public void ActualizarCategorias()
        {
            vista.ListaProductoCategorias = RepositorioProductoCategoria.DevolverTodos();
        }

        public void Aceptar()
        {
            if (vista.Nombre.Trim() == String.Empty)
                throw new Exception("El nombre no puede quedar vacio.");
            switch (vista.Estado)
            {
                case EnumEstado.NUEVO:
                    {
                        ProductoCategoria productoCategoria = new ProductoCategoria();
                        productoCategoria.Nombre = vista.Nombre;
                        RepositorioProductoCategoria.Insertar(productoCategoria);
                        break;
                    }
                case EnumEstado.MODIFICAR:
                    {
                        if (vista.ProductoCategoriaId == (Int32)EnumProductoCategorias.PRODUCTOCATEGORIA_POR_DEFECTO)
                            throw new Exception("No se puede modificar una categoría por defecto.");
                        ProductoCategoria productoCategoria = RepositorioProductoCategoria.DevolverPorId(vista.ProductoCategoriaId);
                        if (productoCategoria == null)
                            throw new Exception("La categoria de producto no existe.");
                        productoCategoria.Nombre = vista.Nombre;
                        RepositorioProductoCategoria.Modificar(productoCategoria);
                        break;
                    }
            }
            vista.ListaProductoCategorias = RepositorioProductoCategoria.DevolverTodos();
        }

        public void Eliminar()
        {
            if (vista.ProductoCategoriaId == (Int32)EnumProductoCategorias.PRODUCTOCATEGORIA_POR_DEFECTO)
                throw new Exception("No se puede eliminar una categoría por defecto.");
            ProductoCategoria productoCategoria = RepositorioProductoCategoria.DevolverPorId(vista.ProductoCategoriaId);
            if (productoCategoria == null)
                throw new Exception("La categoria de producto no existe");
            RepositorioProductoCategoria.ModificarProductoSubCategorias(RepositorioProductoCategoria.DevolverPorId(1), productoCategoria);
            RepositorioProductoCategoria.Eliminar(productoCategoria);
            vista.ListaProductoCategorias = RepositorioProductoCategoria.DevolverTodos();
        }

        #endregion
    }
}
